package cn.test.springdata.base;


import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.Repository;

import java.io.Serializable;
import java.util.List;

/**
 * @auther hanchao
 * @date 2016/10/25 12:11
 */
public interface BaseRepository <T,ID extends Serializable> extends Repository<T, ID>  {
    /**
     * 批量保存或更新,实体必须使用符合JPA规范的注解进行配置 不需确定新建实体是否已经存在
     *
     * @Title: save
     * @param entities
     * @return
     */
    <S extends T> List<S> save(Iterable<S> entities);

    /**
     * 单个保存或更新,实体必须使用符合JPA规范的注解进行配置 不需确定新建实体是否已经存在
     *
     * @param entity
     * @return
     */
    long save(T entity);

    /**
     * 根据ID删除实体,实体必须使用符合JPA规范的注解进行配置
     *
     * @param id
     */
    void delete(ID id);

    /**
     * 根据实体删除
     *
     * @Title: delete
     * @param entity
     */
    void delete(T entity);

    /**
     * 根据主键ID查询实体,实体必须使用符合JPA规范的注解进行配置
     *
     * @param id
     *            主键
     * @return
     */
    T findOne(ID id);

    /**
     * 根据主键ID查找是否存在
     *
     * @param id 主键
     * @return true or false
     */
    boolean exists(ID id);

    /**
     * 查询所有实体数据,实体必须使用符合JPA规范的注解进行配置
     *
     * @return
     */
    List<T> findAll();

    /**
     * 根据ID集合查找,实体必须使用符合JPA规范的注解进行配置
     *
     * @param ids
     * @return
     */
    List<T> findAll(Iterable<ID> ids);

    Iterable<T> findAll(Sort sort);

    Page<T> findAll(Pageable pageable);
}
